#include "服务器与客户端.h"
#include "功能区.h"
#include "数据库.h"

extern int sockArr[3000];                // 保存套接字的数组
extern struct sockaddr_in addrArr[3000]; // 保存地址的数组
sqlite3 *pdb = NULL;                     // 全局的数据库指针

int fdArr[1000];     // 套接字数组
int login_count = 0; // 登录的人数

void _Wlogin(int fd, MSG m1)
{
     W_REGIST *pLG = (W_REGIST *)m1.data; // 把仓库的类型转为LOGIN类型的地址
     printf("收到登录消息，内容是：%s %s\n", pLG->name, pLG->pwd);
     char sql[256];
     // 根据客户端发来的数据构建SQL语句
     sprintf(sql, "select * from 组员名单 where 姓名='%s' and 密码 = '%s'", pLG->name, pLG->pwd);
     QR qr = query_sql(pdb, sql); // 执行查询语句并且返回执行结果

     printQuery(qr);

     if (qr.row > 0) // 说明该用户名和密码在数据库中存在记录
     {
          fdArr[login_count] = fd; // 保存当前登录成功的套接字
          login_count++;           // 登录人数+1
          m1.type = yes;           // 登录成功
     }
     else
     {
          m1.type = no; // 登录失败
     }
     send(fd, &m1, sizeof(m1), 0); // 把结果返回给客户端
}

void _Wregist(int fd, MSG m1)
{
     char sql[256];
     W_REGIST *pRt = (W_REGIST *)m1.data; // 把消息结构体的数据区地址转为注册结构体的地址类型

     // 创建表时使用标准化的表名，并将中文逗号替换为英文逗号
     char tableName[128];
     snprintf(tableName, sizeof(tableName), "W_%s_table", pRt->name); // 示例：添加一个固定的后缀
     sprintf(sql, "CREATE TABLE IF NOT EXISTS %s (任务序号 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 任务名 VARCHAR(128), 完成进度 VARCHAR(128));", tableName);
     exec_sql(pdb, sql);
     // 创建表的 SQL 语句
     strcpy(sql, "CREATE TABLE IF NOT EXISTS 组员名单 (项目组 VARCHAR(128), 工号 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 姓名 VARCHAR(128), 密码 VARCHAR(128), 电话号码 VARCHAR(12));");
     exec_sql(pdb, sql);
     char type[128];
     if (pRt->type_W == 0)
     {
          strcpy(type, "行政管理部门");
     }
     else if (pRt->type_W == 1)
     {
          strcpy(type, "财务部门");
     }
     else if (pRt->type_W == 2)
     {
          strcpy(type, "人事部门");
     }
     else if (pRt->type_W == 3)
     {
          strcpy(type, "研发部门");
     }
     else if (pRt->type_W == 4)
     {
          strcpy(type, "销售部门");
     }

     // 插入数据的 SQL 语句
     sprintf(sql, "INSERT INTO 组员名单 (项目组,姓名,密码,电话号码) VALUES ('%s', '%s', '%s', '%s');",
             type, pRt->name, pRt->pwd, pRt->tel);
     exec_sql(pdb, sql);

     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0); // 把结果返回给客户端
}

void _Bregist(int fd, MSG m1)
{
     char sql[256];
     B_REGIST *pRt = (B_REGIST *)m1.data; // 把消息结构体的数据区地址转为注册结构体的地址类型

     // 创建表时使用标准化的表名，并将中文逗号替换为英文逗号
     char tableName[128];
     snprintf(tableName, sizeof(tableName), "B_%s_table", pRt->name); // 示例：添加一个固定的后缀
     sprintf(sql, "CREATE TABLE IF NOT EXISTS %s (任务序号 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT ,  任务名 VARCHAR(128), 完成进度 VARCHAR(128));", tableName);
     exec_sql(pdb, sql);
     // 创建表的 SQL 语句
     strcpy(sql, "CREATE TABLE IF NOT EXISTS 组长名单 (项目组 VARCHAR(128), 姓名 VARCHAR(128), 密码 VARCHAR(128), 电话号码 VARCHAR(12));");
     exec_sql(pdb, sql);
     char type[128];
     if (pRt->type_B == 0)
     {
          strcpy(type, "行政管理部门");
     }
     else if (pRt->type_B == 1)
     {
          strcpy(type, "财务部门");
     }
     else if (pRt->type_B == 2)
     {
          strcpy(type, "人事部门");
     }
     else if (pRt->type_B == 3)
     {
          strcpy(type, "研发部门");
     }
     else if (pRt->type_B == 4)
     {
          strcpy(type, "销售部门");
     }

     // 插入数据的 SQL 语句
     sprintf(sql, "INSERT INTO 组长名单 VALUES ('%s', '%s', '%s', '%s');",
             type, pRt->name, pRt->pwd, pRt->tel);
     exec_sql(pdb, sql);

     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0); // 把结果返回给客户端
}

void _Blogin(int fd, MSG m1)
{
     B_REGIST *pLG = (B_REGIST *)m1.data; // 把仓库的类型转为LOGIN类型的地址
     printf("收到登录消息，内容是：%s %s\n", pLG->name, pLG->pwd);
     char sql[256];
     // 根据客户端发来的数据构建SQL语句
     sprintf(sql, "select * from 组长名单 where 姓名='%s' and 密码 = '%s'", pLG->name, pLG->pwd);
     QR qr = query_sql(pdb, sql); // 执行查询语句并且返回执行结果

     printQuery(qr);

     if (qr.row > 0) // 说明该用户名和密码在数据库中存在记录
     {
          fdArr[login_count] = fd; // 保存当前登录成功的套接字
          login_count++;           // 登录人数+1
          m1.type = yes;           // 登录成功
     }
     else
     {
          m1.type = no; // 登录失败
     }
     send(fd, &m1, sizeof(m1), 0); // 把结果返回给客户端
}

void _printfuser(int fd, MSG m1)
{
     char sql[] = "select * from 组员名单";
     QR qr = query_sql(pdb, sql);
     int index = qr.col; // 正好跳过表头
     for (size_t i = 0; i < qr.row * qr.col; i += 5)
     {
          W_REGIST sp;
          sp.type_W = atoi(qr.result[index + i]);
          sp.numb = atoi(qr.result[index + i + 1]);
          strcpy(sp.name, qr.result[index + i + 2]);
          strcpy(sp.tel, qr.result[index + i + 4]);
          memcpy(m1.data, &sp, sizeof(sp)); // 把商品信息拷贝消息结构体的数据区
          send(fd, &m1, sizeof(m1), 0);     // 把携带商品信息的消息结构体发给客户端
     }
     m1.type = over;               // 商品发送结束了
     send(fd, &m1, sizeof(m1), 0); // 把携带商品信息的消息结构体发给客户端
}
void _printfboss(int fd, MSG m1)
{
     char sql[] = "select * from 组长名单";
     QR qr = query_sql(pdb, sql);
     int index = qr.col; // 正好跳过表头
     for (size_t i = 0; i < qr.row * qr.col; i += 4)
     {
          B_REGIST sp;
          sp.type_B = atoi(qr.result[index + i]);
          strcpy(sp.name, qr.result[index + i + 1]);
          strcpy(sp.tel, qr.result[index + i + 3]);
          memcpy(m1.data, &sp, sizeof(sp));
          send(fd, &m1, sizeof(m1), 0);
     }
     m1.type = over;
     send(fd, &m1, sizeof(m1), 0);
}

void _changeuser_id(int fd, MSG m1)
{
     NUMB *pnum = (NUMB *)m1.data;

     char sql[1000];
     sprintf(sql, "UPDATE 组员名单 SET 工号 = %d WHERE 工号 = %d;", pnum->new_num, pnum->old_num);
     exec_sql(pdb, sql);
     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}
void _changeuser_name(int fd, MSG m1)
{
     NAME *pname = (NAME *)m1.data;
     printf("%s,%s\n", pname->old_name, pname->new_name);

     // 获取旧用户名和新用户名
     char old_name[128];
     char new_name[128];
     strcpy(old_name, pname->old_name);
     strcpy(new_name, pname->new_name);

     // 构建重命名表的 SQL 语句
     char old_table_name[128];
     char new_table_name[128];
     snprintf(old_table_name, sizeof(old_table_name), "W_%s_table", old_name);
     snprintf(new_table_name, sizeof(new_table_name), "W_%s_table", new_name);

     char rename_table_sql[256];
     sprintf(rename_table_sql, "ALTER TABLE %s RENAME TO %s;", old_table_name, new_table_name);

     // 执行重命名表的操作
     exec_sql(pdb, rename_table_sql);

     // 构建更新用户名的 SQL 语句
     char update_sql[256];
     sprintf(update_sql, "UPDATE 组员名单 SET 姓名 = '%s' WHERE 姓名 = '%s';", new_name, old_name);

     // 执行更新用户名的操作
     exec_sql(pdb, update_sql);

     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}

void _changeuser_pwd(int fd, MSG m1)
{
     PASSWORD *ppwd = (PASSWORD *)m1.data;
     char sql[256];
     sprintf(sql, "UPDATE 组员名单 SET 密码 = '%s' WHERE 姓名 = '%s' AND 密码 = '%s';", ppwd->new_pwd, ppwd->name, ppwd->old_pwd);
     exec_sql(pdb, sql);
     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}

void _changeuser_phone(int fd, MSG m1)
{
     PHONE *pphone = (PHONE *)m1.data;
     char sql[256];
     sprintf(sql, "UPDATE 组员名单 SET 电话号码 = '%s' WHERE 姓名 = '%s' AND 电话号码 = '%s';", pphone->new_tel, pphone->name, pphone->old_tel);
     exec_sql(pdb, sql);
     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}
void _changeboss_name(int fd, MSG m1)
{
     NAME *pname = (NAME *)m1.data;
     printf("%s,%s\n", pname->old_name, pname->new_name);

     // 获取旧用户名和新用户名
     char old_name[128];
     char new_name[128];
     strcpy(old_name, pname->old_name);
     strcpy(new_name, pname->new_name);

     // 构建重命名表的 SQL 语句
     char old_table_name[128];
     char new_table_name[128];
     snprintf(old_table_name, sizeof(old_table_name), "B_%s_table", old_name);
     snprintf(new_table_name, sizeof(new_table_name), "B_%s_table", new_name);

     char rename_table_sql[256];
     sprintf(rename_table_sql, "ALTER TABLE %s RENAME TO %s;", old_table_name, new_table_name);

     // 执行重命名表的操作
     exec_sql(pdb, rename_table_sql);

     // 构建更新用户名的 SQL 语句
     char update_sql[256];
     sprintf(update_sql, "UPDATE 组长名单 SET 姓名 = '%s' WHERE 姓名 = '%s';", new_name, old_name);

     // 执行更新用户名的操作
     exec_sql(pdb, update_sql);

     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}

void _changeboss_pwd(int fd, MSG m1)
{
     PASSWORD *ppwd = (PASSWORD *)m1.data;
     char sql[256];
     sprintf(sql, "UPDATE 组长名单 SET 密码 = '%s' WHERE 姓名 = '%s' AND 密码 = '%s';", ppwd->new_pwd, ppwd->name, ppwd->old_pwd);
     exec_sql(pdb, sql);
     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}

void _changeboss_phone(int fd, MSG m1)
{
     PHONE *pphone = (PHONE *)m1.data;
     char sql[256];
     sprintf(sql, "UPDATE 组长名单 SET 电话号码 = '%s' WHERE 姓名 = '%s' AND 电话号码 = '%s';", pphone->new_tel, pphone->name, pphone->old_tel);
     exec_sql(pdb, sql);
     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}

void _delete_user(int fd, MSG m1)
{
     char *sql = m1.data;

     // 提取工号
     int user_id;
     if (sscanf(sql, "DELETE FROM 组员名单 WHERE 工号 = %d;", &user_id) != 1)
     {
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     // 获取用户名
     char query_sql_str[256];
     sprintf(query_sql_str, "SELECT 姓名 FROM 组员名单 WHERE 工号 = %d;", user_id);
     QR qr = query_sql(pdb, query_sql_str);

     if (qr.row == 0)
     {
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     char username[128];
     strcpy(username, qr.result[qr.col]); // 假设用户名在第一列

     // 构建删除用户表的 SQL 语句
     char table_name[128];
     snprintf(table_name, sizeof(table_name), "W_%s_table", username);

     char drop_table_sql[256];
     sprintf(drop_table_sql, "DROP TABLE IF EXISTS %s;", table_name);

     // 执行删除表的操作
     exec_sql(pdb, drop_table_sql);

     // 执行删除用户的 SQL 语句
     exec_sql(pdb, sql);

     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}

void _delete_boss(int fd, MSG m1)
{
     char *sql = m1.data;

     // 提取用户名
     char username[128];
     if (sscanf(sql, "DELETE FROM 组长名单 WHERE 姓名 = '%[^']';", username) != 1)
     {
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     // 构建删除用户表的 SQL 语句
     char table_name[128];
     snprintf(table_name, sizeof(table_name), "B_%s_table", username);

     char drop_table_sql[256];
     sprintf(drop_table_sql, "DROP TABLE IF EXISTS %s;", table_name);

     // 执行删除表的操作
     exec_sql(pdb, drop_table_sql);

     // 执行删除用户的 SQL 语句
     exec_sql(pdb, sql);

     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}
void _howmess_age(int fd, MSG m1)
{
     // 假设 MSG 结构体中包含组长的用户名
     char username[128];
     strncpy(username, m1.data, sizeof(username) - 1);
     username[sizeof(username) - 1] = '\0'; // 确保字符串以 null 结尾

     // 构建表名
     char table_name[128];
     snprintf(table_name, sizeof(table_name), "B_%s_table", username);

     // 构建查询未完成任务数量的 SQL 语句
     char sql[256];
     sprintf(sql, "SELECT COUNT(*) FROM %s WHERE 完成进度 IS NULL OR 完成进度 != '完成';", table_name);

     // 执行查询
     QR qr = query_sql(pdb, sql);

     if (qr.row == 0)
     {
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     // 获取未完成任务的数量
     int unfinished_count = atoi(qr.result[qr.col]);

     // 将结果发送回客户端
     sprintf(m1.data, "%d", unfinished_count);
     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}

void _alladdtask(int fd, MSG m1)
{
     TAST *task = (TAST *)m1.data;
     char task_name[128];
     char grouper_name[128];
     char type[128];
     int user_id = task->id; // 假设 TAST 结构体中有 id 字段
     strncpy(task_name, task->tastname, sizeof(task_name) - 1);
     task_name[sizeof(task_name) - 1] = '\0'; // 确保字符串以 null 结尾
     strncpy(grouper_name, task->groupername, sizeof(grouper_name) - 1);
     grouper_name[sizeof(grouper_name) - 1] = '\0'; // 确保字符串以 null 结尾
     strncpy(type, task->type, sizeof(type) - 1);
     type[sizeof(type) - 1] = '\0'; // 确保字符串以 null 结尾

     char sql[256];

     // 群发任务
     // 获取当前登录的组长用户名
     char boss_name[128];
     strncpy(boss_name, task->groupername, sizeof(boss_name) - 1);
     boss_name[sizeof(boss_name) - 1] = '\0'; // 确保字符串以 null 结尾

     // 获取项目组
     sprintf(sql, "SELECT 项目组 FROM 组长名单 WHERE 姓名 = '%s';", boss_name);
     QR qr = query_sql(pdb, sql);

     if (qr.row == 0)
     {
          printf("未找到项目组信息\n");
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     char project_group[128];
     strncpy(project_group, qr.result[qr.col], sizeof(project_group) - 1);
     project_group[sizeof(project_group) - 1] = '\0'; // 确保字符串以 null 结尾

     // 获取项目组中的所有组员
     sprintf(sql, "SELECT 姓名 FROM 组员名单 WHERE 项目组 = '%s';", project_group);
     QR qr_users = query_sql(pdb, sql);

     if (qr_users.row == 0)
     {
          printf("项目组中没有组员\n");
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     // 在组长的表中添加任务
     char boss_table_name[128];
     snprintf(boss_table_name, sizeof(boss_table_name), "B_%s_table", boss_name);

     // 确保表已创建
     sprintf(sql, "CREATE TABLE IF NOT EXISTS %s (任务序号 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 任务名 VARCHAR(128), 完成进度 VARCHAR(128));", boss_table_name);
     exec_sql(pdb, sql);

     // 构建插入任务的 SQL 语句
     char insert_boss_sql[256];
     sprintf(insert_boss_sql, "INSERT INTO %s (任务名, 完成进度) VALUES ('%s', NULL);", boss_table_name, task_name);

     // 执行插入操作
     exec_sql(pdb, insert_boss_sql);

     for (size_t i = 1; i <= qr_users.row; i++)
     {
          char user_name[128];
          strncpy(user_name, qr_users.result[i * qr_users.col], sizeof(user_name) - 1);
          user_name[sizeof(user_name) - 1] = '\0'; // 确保字符串以 null 结尾

          // 构建表名
          char table_name[128];
          snprintf(table_name, sizeof(table_name), "W_%s_table", user_name);

          // 确保表已创建
          sprintf(sql, "CREATE TABLE IF NOT EXISTS %s (任务序号 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 任务名 VARCHAR(128), 完成进度 VARCHAR(128));", table_name);
          exec_sql(pdb, sql);

          // 构建插入任务的 SQL 语句
          char insert_sql[256];
          sprintf(insert_sql, "INSERT INTO %s (任务名, 完成进度) VALUES ('%s', NULL);", table_name, task_name);

          // 执行插入操作
          exec_sql(pdb, insert_sql);

          m1.type = yes;
          send(fd, &m1, sizeof(m1), 0); // 插入成功
     }
     /* else
     {
         // 单独发任务
         // 构建表名
         char table_name[128];
         snprintf(table_name, sizeof(table_name), "W_%s_table", grouper_name);

         // 确保表已创建
         sprintf(sql, "CREATE TABLE IF NOT EXISTS %s (任务序号 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 任务名 VARCHAR(128), 完成进度 VARCHAR(128));", table_name);
         exec_sql(pdb, sql);

         // 构建插入任务的 SQL 语句
         sprintf(sql, "INSERT INTO %s (任务名, 完成进度) VALUES ('%s', NULL);", table_name, task_name);

         // 执行插入操作
         exec_sql(pdb, sql);

         // 获取当前登录的组长用户名
         char boss_name[128];
         strncpy(boss_name, task->groupername, sizeof(boss_name) - 1);
         boss_name[sizeof(boss_name) - 1] = '\0'; // 确保字符串以 null 结尾

         // 在组长的表中添加任务
         char boss_table_name[128];
         snprintf(boss_table_name, sizeof(boss_table_name), "B_%s_table", boss_name);

         // 确保表已创建
         sprintf(sql, "CREATE TABLE IF NOT EXISTS %s (任务序号 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 任务名 VARCHAR(128), 完成进度 VARCHAR(128));", boss_table_name);
         exec_sql(pdb, sql);

         // 构建插入任务的 SQL 语句
         char insert_boss_sql[256];
         sprintf(insert_boss_sql, "INSERT INTO %s (任务名, 完成进度) VALUES ('%s', NULL);", boss_table_name, task_name);

         // 执行插入操作
         exec_sql(pdb, insert_boss_sql);

         m1.type = yes;
         send(fd, &m1, sizeof(m1), 0); // 插入成功
     } */
}

void _addtask(int fd, MSG m1)
{
     TAST *task = (TAST *)m1.data;
     // 任务名
     char task_name[128];
     // 组员名
     char worker_name[128];
     char type[128];
     int user_id = task->id; // 假设 TAST 结构体中有 id 字段
     strncpy(task_name, task->tastname, sizeof(task_name) - 1);
     task_name[sizeof(task_name) - 1] = '\0'; // 确保字符串以 null 结尾
     strncpy(worker_name, task->workername, sizeof(worker_name) - 1);
     worker_name[sizeof(worker_name) - 1] = '\0'; // 确保字符串以 null 结尾
     strncpy(type, task->type, sizeof(type) - 1);
     type[sizeof(type) - 1] = '\0'; // 确保字符串以 null 结尾
     printf("%s\n", worker_name);
     char sql[256];

     // 单独发任务
     // 构建表名
     char table_name[128];
     snprintf(table_name, sizeof(table_name), "W_%s_table", worker_name);

     // 确保表已创建
     sprintf(sql, "CREATE TABLE IF NOT EXISTS %s (任务序号 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 任务名 VARCHAR(128), 完成进度 VARCHAR(128));", table_name);
     exec_sql(pdb, sql);

     // 构建插入任务的 SQL 语句
     sprintf(sql, "INSERT INTO %s (任务名, 完成进度) VALUES ('%s', NULL);", table_name, task_name);

     // 执行插入操作
     exec_sql(pdb, sql);

     // 获取当前登录的组长用户名
     char boss_name[128];
     strncpy(boss_name, task->groupername, sizeof(boss_name) - 1);
     boss_name[sizeof(boss_name) - 1] = '\0'; // 确保字符串以 null 结尾

     // 在组长的表中添加任务
     char boss_table_name[128];
     snprintf(boss_table_name, sizeof(boss_table_name), "B_%s_table", boss_name);

     // 确保表已创建
     sprintf(sql, "CREATE TABLE IF NOT EXISTS %s (任务序号 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 任务名 VARCHAR(128), 完成进度 VARCHAR(128));", boss_table_name);
     exec_sql(pdb, sql);

     // 构建插入任务的 SQL 语句
     char insert_boss_sql[256];
     sprintf(insert_boss_sql, "INSERT INTO %s (任务名, 完成进度) VALUES ('%s', NULL);", boss_table_name, task_name);

     // 执行插入操作
     exec_sql(pdb, insert_boss_sql);

     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0); // 插入成功
}

void _deltask(int fd, MSG m1)
{
     delTEST *task = (delTEST *)m1.data;
     int task_id = task->id;
     printf("删除任务 ID: %d\n", task_id);
     char grouper_name[128];
     strncpy(grouper_name, task->name, sizeof(grouper_name) - 1);
     grouper_name[sizeof(grouper_name) - 1] = '\0'; // 确保字符串以 null 结尾
     printf("组员姓名: %s\n", grouper_name);
     // 构建表名
     char table_name[128];
     snprintf(table_name, sizeof(table_name), "B_%s_table", grouper_name);

     // 构建删除任务的 SQL 语句
     char sql[256];
     sprintf(sql, "DELETE FROM %s WHERE 任务序号 = %d;", table_name, task_id);

     // 执行删除操作
     exec_sql(pdb, sql);

     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0); // 删除成功
}
void _printftask(int fd, MSG m1)
{
     PRINTFTASK *printTask = (PRINTFTASK *)m1.data;
     char grouper_name[128];
     strncpy(grouper_name, printTask->name, sizeof(grouper_name) - 1);
     grouper_name[sizeof(grouper_name) - 1] = '\0'; // 确保字符串以 null 结尾

     // 构建表名
     char table_name[128];
     snprintf(table_name, sizeof(table_name), "B_%s_table", grouper_name);

     // 构建查询任务的 SQL 语句
     char sql[256];
     sprintf(sql, "SELECT * FROM %s;", table_name);
     printf("sql:%s\n", sql);
     // 执行查询操作
     QR qr = query_sql(pdb, sql);
     if (qr.row == 0)
     {
          printf("没有任务\n");
          MSG m1;
          m1.type = over;
          send(fd, &m1, sizeof(m1), 0); // 发送结束标志
          return;
     }

     // 发送任务信息
     for (size_t i = 1; i <= qr.row; i++)
     {
          TASK task;
          char so[16] = "未完成";
          task.id = atoi(qr.result[i * qr.col]);
          strcpy(task.name, qr.result[i * qr.col + 1]);
          if (qr.result[i * qr.col + 2] == NULL)
          {
               strcpy(task.progress, so);
          }
          else
          {
               strcpy(task.progress, qr.result[i * qr.col + 2]);
          }
          printf("%d %s %s\n", task.id, task.name, task.progress);
          MSG m1;
          m1.type = taskinfo;
          memcpy(m1.data, &task, sizeof(task));
          send(fd, &m1, sizeof(m1), 0);
     }

     // 发送结束标志
     MSG m;
     m.type = over;
     send(fd, &m, sizeof(m), 0);
}
void _whowmessage(int fd, MSG m1)
{
     // 假设 MSG 结构体中包含组长的用户名
     char username[128];
     strncpy(username, m1.data, sizeof(username) - 1);
     username[sizeof(username) - 1] = '\0'; // 确保字符串以 null 结尾

     // 构建表名
     char table_name[128];
     snprintf(table_name, sizeof(table_name), "W_%s_table", username);

     // 构建查询未完成任务数量的 SQL 语句
     char sql[256];
     sprintf(sql, "SELECT COUNT(*) FROM %s WHERE 完成进度 IS NULL OR 完成进度 != '完成';", table_name);
     // 执行查询
     QR qr = query_sql(pdb, sql);

     if (qr.row == 0)
     {
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     // 获取未完成任务的数量
     int unfinished_count = atoi(qr.result[qr.col]);
     if (unfinished_count == 0)
     {
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }
     // 将结果发送回客户端
     sprintf(m1.data, "%d", unfinished_count);
     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}
void _userprinttask(int fd, MSG m1)
{
     PRINTFTASK *printTask = (PRINTFTASK *)m1.data;
     char worker_name[128];
     printf("组员姓名: %s\n", printTask->name);
     strncpy(worker_name, printTask->name, sizeof(worker_name) - 1);
     worker_name[sizeof(worker_name) - 1] = '\0'; // 确保字符串以 null 结尾

     // 构建表名
     char table_name[128];
     snprintf(table_name, sizeof(table_name), "W_%s_table", worker_name);

     // 构建查询任务的 SQL 语句
     char sql[256];
     sprintf(sql, "SELECT * FROM %s;", table_name);
     printf("sql:%s\n", sql);
     // 执行查询操作
     QR qr = query_sql(pdb, sql);
     if (qr.row == 0)
     {
          printf("没有任务\n");
          MSG m1;
          m1.type = over;
          send(fd, &m1, sizeof(m1), 0); // 发送结束标志
          return;
     }

     // 发送任务信息
     for (size_t i = 1; i <= qr.row; i++)
     {
          TASK task;
          char so[16] = "未完成";
          task.id = atoi(qr.result[i * qr.col]);
          strcpy(task.name, qr.result[i * qr.col + 1]);
          if (qr.result[i * qr.col + 2] == NULL)
          {
               strcpy(task.progress, so);
          }
          else
          {
               strcpy(task.progress, qr.result[i * qr.col + 2]);
          }
          printf("%d %s %s\n", task.id, task.name, task.progress);
          MSG m1;
          m1.type = taskinfo;
          memcpy(m1.data, &task, sizeof(task));
          send(fd, &m1, sizeof(m1), 0);
     }
     MSG m;
     m.type = over;
     send(fd, &m, sizeof(m), 0);
}
void _overmes(int fd, MSG m1)
{
     OVPS *ovname = (OVPS *)m1.data;

     // 获取项目组信息
     char sql[256];
     sprintf(sql, "SELECT 项目组 FROM 组员名单 WHERE 姓名 = '%s';", ovname->name);
     QR qr_group = query_sql(pdb, sql);

     if (qr_group.row == 0)
     {
          printf("未找到项目组信息\n");
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     char project_group[128];
     strncpy(project_group, qr_group.result[qr_group.col], sizeof(project_group) - 1);
     project_group[sizeof(project_group) - 1] = '\0'; // 确保字符串以 null 结尾

     // 获取项目组中的所有组员
     sprintf(sql, "SELECT 姓名 FROM 组员名单 WHERE 项目组 = '%s';", project_group);
     QR qr_users = query_sql(pdb, sql);

     if (qr_users.row == 0)
     {
          printf("项目组中没有组员\n");
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     // 获取项目组中的所有组长
     sprintf(sql, "SELECT 姓名 FROM 组长名单 WHERE 项目组 = '%s';", project_group);
     QR qr_bosses = query_sql(pdb, sql);

     if (qr_bosses.row == 0)
     {
          printf("项目组中没有组长\n");
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     // 获取任务名
     char task_name[128];
     sprintf(sql, "SELECT 任务名 FROM W_%s_table WHERE 任务序号 = %d;", ovname->name, ovname->id);
     QR qr_task = query_sql(pdb, sql);

     if (qr_task.row == 0)
     {
          printf("任务不存在\n");
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     strncpy(task_name, qr_task.result[qr_task.col], sizeof(task_name) - 1);
     task_name[sizeof(task_name) - 1] = '\0'; // 确保字符串以 null 结尾

     // 更新组员表中的任务进度
     char user_table_name[128];
     snprintf(user_table_name, sizeof(user_table_name), "W_%s_table", ovname->name);
     sprintf(sql, "UPDATE %s SET 完成进度 = '%s' WHERE 任务序号 = %d;", user_table_name, ovname->overpa, ovname->id);
     exec_sql(pdb, sql);

     // 更新组长表中的任务进度
     for (size_t i = 1; i <= qr_bosses.row; i++)
     {
          char boss_name[128];
          strncpy(boss_name, qr_bosses.result[i * qr_bosses.col], sizeof(boss_name) - 1);
          boss_name[sizeof(boss_name) - 1] = '\0'; // 确保字符串以 null 结尾

          char boss_table_name[128];
          snprintf(boss_table_name, sizeof(boss_table_name), "B_%s_table", boss_name);
          sprintf(sql, "UPDATE %s SET 完成进度 = '%s' WHERE 任务名 = '%s';", boss_table_name, ovname->overpa, task_name);
          exec_sql(pdb, sql);
     }

     // 更新同项目组其他组员的相同任务名的任务进度
     for (size_t i = 1; i <= qr_users.row; i++)
     {
          char user_name[128];
          strncpy(user_name, qr_users.result[i * qr_users.col], sizeof(user_name) - 1);
          user_name[sizeof(user_name) - 1] = '\0'; // 确保字符串以 null 结尾

          if (strcmp(user_name, ovname->name) != 0) // 跳过当前组员
          {
               char table_name[128];
               snprintf(table_name, sizeof(table_name), "W_%s_table", user_name);
               sprintf(sql, "UPDATE %s SET 完成进度 = '%s' WHERE 任务名 = '%s';", table_name, ovname->overpa, task_name);
               exec_sql(pdb, sql);
          }
     }

     // 发送更新结果
     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}
void _delworker(int fd, MSG m1)
{
     char *worker_name = m1.data;

     // 获取组员ID
     char sql[256];
     sprintf(sql, "SELECT 工号 FROM 组员名单 WHERE 姓名 = '%s';", worker_name);
     QR qr = query_sql(pdb, sql);

     if (qr.row == 0)
     {
          printf("未找到该组员。\n");
          m1.type = no;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     int worker_id = atoi(qr.result[qr.col]);

     // 创建离职请求表（如果不存在）
     sprintf(sql, "CREATE TABLE IF NOT EXISTS 离职请求 (组员名 VARCHAR(128), 工号 INTEGER, 状态 VARCHAR(128));");
     exec_sql(pdb, sql);

     // 插入离职请求
     sprintf(sql, "INSERT INTO 离职请求 (组员名, 工号, 状态) VALUES ('%s', %d, '待处理');", worker_name, worker_id);
     exec_sql(pdb, sql);

     m1.type = yes;
     send(fd, &m1, sizeof(m1), 0);
}
void _printfdelworker(int fd, MSG m1)
{
     char sql[] = "SELECT 组员名, 工号 FROM 离职请求 WHERE 状态 = '待处理';";
     QR qr = query_sql(pdb, sql);

     if (qr.row == 0)
     {
          m1.type = over;
          send(fd, &m1, sizeof(m1), 0);
          return;
     }

     for (size_t i = 1; i <= qr.row; i++)
     {
          char data[256];
          snprintf(data, sizeof(data), "%s %d", qr.result[i * qr.col], atoi(qr.result[i * qr.col + 1]));
          memcpy(m1.data, data, sizeof(m1.data));
          m1.type = delworker;
          send(fd, &m1, sizeof(m1), 0);
     }

     m1.type = over;
     send(fd, &m1, sizeof(m1), 0);
}
void _delworker_confirm(int fd, MSG m1)
{
    int worker_id = atoi(m1.data);

    // 获取组员名
    char sql[256];
    sprintf(sql, "SELECT 姓名 FROM 组员名单 WHERE 工号 = %d;", worker_id);
    QR qr = query_sql(pdb, sql);

    if (qr.row == 0)
    {
        printf("未找到该工号的组员。\n");
        m1.type = no;
        send(fd, &m1, sizeof(m1), 0);
        return;
    }

    char worker_name[128];
    strncpy(worker_name, qr.result[qr.col], sizeof(worker_name) - 1);
    worker_name[sizeof(worker_name) - 1] = '\0'; // 确保字符串以 null 结尾

    // 构建组员表名
    char table_name[128];
    snprintf(table_name, sizeof(table_name), "W_%s_table", worker_name);

    // 检查组员表中是否有未完成的任务
    sprintf(sql, "SELECT COUNT(*) FROM %s WHERE 完成进度 IS NULL OR 完成进度 != '完成';", table_name);
    QR qr_tasks = query_sql(pdb, sql);

    if (qr_tasks.row > 0 && atoi(qr_tasks.result[qr_tasks.col]) > 0)
    {
        printf("组员 %s 有未完成的任务。\n", worker_name);

        // 获取组员的项目组
        sprintf(sql, "SELECT 项目组 FROM 组员名单 WHERE 工号 = %d;", worker_id);
        QR qr_group = query_sql(pdb, sql);

        if (qr_group.row == 0)
        {
            printf("未找到项目组信息。\n");
            m1.type = no;
            send(fd, &m1, sizeof(m1), 0);
            return;
        }

        char project_group[128];
        strncpy(project_group, qr_group.result[qr_group.col], sizeof(project_group) - 1);
        project_group[sizeof(project_group) - 1] = '\0'; // 确保字符串以 null 结尾

        // 获取项目组中的所有组长
        sprintf(sql, "SELECT 姓名 FROM 组长名单 WHERE 项目组 = '%s';", project_group);
        QR qr_bosses = query_sql(pdb, sql);

        if (qr_bosses.row == 0)
        {
            printf("项目组中没有组长。\n");
            m1.type = no;
            send(fd, &m1, sizeof(m1), 0);
            return;
        }

        // 构建提醒消息
        char reminder[256];
        snprintf(reminder, sizeof(reminder), "组员 %s 有未完成的任务，请处理。", worker_name);

        // 发送提醒消息给组长
        for (size_t i = 1; i <= qr_bosses.row; i++)
        {
            char boss_name[128];
            strncpy(boss_name, qr_bosses.result[i * qr_bosses.col], sizeof(boss_name) - 1);
            boss_name[sizeof(boss_name) - 1] = '\0'; // 确保字符串以 null 结尾

            // 找到组长的套接字
            for (int j = 0; j < login_count; j++)
            {
                if (fdArr[j] != -1)
                {
                    char boss_sql[256];
                    sprintf(boss_sql, "SELECT 姓名 FROM 组长名单 WHERE 姓名 = '%s';", boss_name);
                    QR qr_boss_fd = query_sql(pdb, boss_sql);

                    if (qr_boss_fd.row > 0 && strcmp(qr_boss_fd.result[qr_boss_fd.col], boss_name) == 0)
                    {
                        MSG m2;
                        m2.type = reminder_msg;
                        strncpy(m2.data, reminder, sizeof(m2.data) - 1);
                        m2.data[sizeof(m2.data) - 1] = '\0'; // 确保字符串以 null 结尾
                        send(fdArr[j], &m2, sizeof(m2), 0);
                        break;
                    }
                }
            }
        }

        // 将结果发送回客户端
        m1.type = no;
        strncpy(m1.data, reminder, sizeof(m1.data) - 1);
        m1.data[sizeof(m1.data) - 1] = '\0'; // 确保字符串以 null 结尾
        send(fd, &m1, sizeof(m1), 0);

        // 将离职请求的状态改为已处理
        sprintf(sql, "UPDATE 离职请求 SET 状态 = '已处理' WHERE 工号 = %d;", worker_id);
        exec_sql(pdb, sql);
        return;
    }

    // 删除组员及其相关表
    sprintf(sql, "DELETE FROM 组员名单 WHERE 工号 = %d;", worker_id);
    exec_sql(pdb, sql);

    snprintf(table_name, sizeof(table_name), "W_%s_table", worker_name);
    sprintf(sql, "DROP TABLE IF EXISTS %s;", table_name);
    exec_sql(pdb, sql);

    // 将离职请求的状态改为已处理
    sprintf(sql, "UPDATE 离职请求 SET 状态 = '已处理' WHERE 工号 = %d;", worker_id);
    exec_sql(pdb, sql);

    m1.type = yes;
    send(fd, &m1, sizeof(m1), 0);
}

void _delwotask(int fd, MSG m1)
{
   delTEST *task = (delTEST *)m1.data;

    // 获取任务ID和组员名
    int task_id = task->id;
    char worker_name[128];
    strncpy(worker_name, task->name, sizeof(worker_name) - 1);
    worker_name[sizeof(worker_name) - 1] = '\0'; // 确保字符串以 null 结尾

    // 构建组员表名
    char table_name[128];
    snprintf(table_name, sizeof(table_name), "W_%s_table", worker_name);

    // 构建删除任务的 SQL 语句
    char sql[256];
    sprintf(sql, "DELETE FROM %s WHERE 任务序号 = %d;", table_name, task_id);

    // 执行删除任务的 SQL 语句
    exec_sql(pdb, sql);

    m1.type = yes;
    send(fd, &m1, sizeof(m1), 0); // 删除成功
}
void work1(int fd, MSG m1)
{
     if (m1.type == W_login) // 消息类型是否是登录
     {
          _Wlogin(fd, m1);
     }
     else if (m1.type == W_regist)
     {
          _Wregist(fd, m1);
     }
     else if (m1.type == B_login)
     {
          _Blogin(fd, m1);
     }
     else if (m1.type == B_regist)
     {
          _Bregist(fd, m1);
     }
     else if (m1.type == printfuser)
     {
          _printfuser(fd, m1);
     }
     else if (m1.type == printfboss)
     {
          _printfboss(fd, m1);
     }
     else if (m1.type == changeuser_id)
     {
          _changeuser_id(fd, m1);
     }
     else if (m1.type == changeuser_name)
     {
          _changeuser_name(fd, m1);
     }
     else if (m1.type == changeuser_pwd)
     {
          _changeuser_pwd(fd, m1);
     }
     else if (m1.type == changeuser_phone)
     {
          _changeuser_phone(fd, m1);
     }
     else if (m1.type == changeboss_name)
     {
          _changeboss_name(fd, m1);
     }
     else if (m1.type == changeboss_pwd)
     {
          _changeboss_pwd(fd, m1);
     }
     else if (m1.type == changeboss_phone)
     {
          _changeboss_phone(fd, m1);
     }
     else if (m1.type == changeuser_id)
     {
          _changeuser_id(fd, m1);
     }
     else if (m1.type == deleteuser)
     {
          _delete_user(fd, m1);
     }
     else if (m1.type == deleteboss)
     {
          _delete_boss(fd, m1);
     }
     else if (m1.type == howmessage)
     {
          _howmess_age(fd, m1);
     }
     else if (m1.type == alladdtask)
     {
          _alladdtask(fd, m1);
     }
     else if (m1.type == addtask)
     {
          _addtask(fd, m1);
     }
     else if (m1.type == deltask)
     {
          _deltask(fd, m1);
     }
     else if (m1.type == printftask)
     {
          _printftask(fd, m1);
     }
     else if (m1.type == whowmessage)
     {
          _whowmessage(fd, m1);
     }
     else if (m1.type == userprinttask)
     {
          _userprinttask(fd, m1);
     }
     else if (m1.type == overmes)
     {
          _overmes(fd, m1);
     }
     else if (m1.type == delworker)
     {
          _delworker(fd, m1);
     }
     else if (m1.type == printfdelworker)
     {
          _printfdelworker(fd, m1);
     }
     else if (m1.type == delworker_confirm)
     {
          _delworker_confirm(fd, m1);
     }else if (m1.type == delwotask)
     {
          _delwotask(fd, m1);
     }
     else if (m1.type == reminder_msg)
     {
          printf("提醒消息: %s\n", m1.data);
          // 这里可以添加更多的处理逻辑，例如显示提醒消息给组长
     }
     else
     {
          printf("未知的消息类型\n");
     }
}
int main(int argc, char const *argv[])
{
     pdb = openDatabase("abc.db"); // 打开数据库并赋值
     MSG m1;
     if (-1 == initServer())
     {
          closeDatabase(pdb); // 关闭数据库
          return 0;
     }

     run();
     closeDatabase(pdb);
     return 0;
}